#ifndef DSPSIMULATOR_ELFLOADER_H
#define DSPSIMULATOR_ELFLOADER_H

#include <memory>
#include <simulator/elf/elf32/elf32ProgramHeaderTable.h>
#include <simulator/elf/elf32/elf32Header.h>

class Memory;

class ELFLoader {
protected:
    /**
     * 加载elf文件的第i个段的信息
     * @param phdr 程序会将第i个段的信息保存到此数据结构
     * @param ehdr 包含elf Header信息的数据结构
     * @param i 需要加载的段索引
     * @param elfFile  elf文件流对象
     */
    virtual void load_phdr(Elf32_Phdr *phdr, Elf32_Ehdr *ehdr, u32 i, std::ifstream &elfFile) = 0;

    /**
     * 将ELF文件以段为单位加载到内存中
     * @param index 段在elf文件中的索引编号
     * @param phdr 当前段的Program Header表项
     * @param elfFileStream elf文件流对象
     * @param memory 内存
     */
    virtual void
    loadSegmentIntoMemory(u64 index, std::shared_ptr<Memory> memory, Elf32_Phdr *phdr, std::ifstream &elfFile) = 0;

public:
    /**
     * 加载elf文件各个段到内存中
     * @param elfFilePath 需要加载的elf文件路径
     * @param memory 内存
     * @return 程序执行的入口地址
     */
    virtual u64 loadELFProgramIntoMemory(const char *elfFilePath, std::shared_ptr<Memory> memory) = 0;

    ELFLoader() = default;

    virtual ~ELFLoader() = default;
};

#endif //DSPSIMULATOR_ELFLOADER_H
